package users

import (
	"context"
	v1 "fiberx/api/users/v1"
	"fiberx/internal/global"
	"fiberx/internal/global/response"
	"time"

	"github.com/gofiber/fiber/v3"
)

func (c *ControllerV1) OtpUrl(ctx fiber.Ctx) error {
	// 检查请求体长度是否为 0
	if len(ctx.GetReqHeaders()["Content-Length"]) == 0 {
		return response.RES.JSON(ctx, response.ERROR_INVALID_PARAM)
	}
	// 从请求中获取用户Email
	req := new(v1.OtpUrlReq)
	err := ctx.Bind().JSON(req) // 使用 ShouldBind 绑定请求体到结构体，前端使用json格式传递数据
	if err != nil {
		return response.RES.JSON(ctx, response.ERROR_INVALID_PARAM, response.WithMsg(err.Error()))
	}

	res, otpsecret, err := c.users.GetTotpUrl(req)
	if err != nil {
		return response.RES.JSON(ctx, response.ERROR_OTP, response.WithMsg(err.Error()))
	}

	// 临时保存OTP密钥到redis: 300秒过期(5分钟)
	err = global.R.Set(context.Background(), req.Email, otpsecret, 3000*time.Second).Err()
	if err != nil {
		return response.RES.JSON(ctx, response.ERROR_OTP_SET_REDIS, response.WithMsg(err.Error()))
	}
	// 手动日志
	// global.L.Info("OTP MESSAGE", zap.String("email", req.Email), zap.String("otpsecret", otpsecret))
	// 返回成功响应
	return response.RES.JSON(ctx, response.OK, response.WithData(res), response.WithMsg("OTP URL generated successfully"))
}
